package com.wangxin.study8.streams;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;

/**
 * @author jojo.wang
 * @title: StreamsTest
 * @projectName http-invoke
 * @description: TODO
 * @date 2019/3/1314:51
 */

public class StreamsTest {
    public static void main(String[] args) {
        List<String> stringList = new ArrayList<>();
        stringList.add("ddd2");
        stringList.add("aaa2");
        stringList.add("bbb1");
        stringList.add("aaa1");
        stringList.add("bbb3");
        stringList.add("ccc");
        stringList.add("bbb2");
        stringList.add("ddd1");

        //======================================================================================
        //Filter(过滤)
        stringList.stream().filter(s->s.startsWith("a")).forEach(System.out::println);

        //======================================================================================
        //排序，需要注意的是，排序只创建了一个排列好后的Stream，而不会影响原有的数据源，排序之后原数据stringCollection是不会被修改的
        stringList.stream().sorted().filter(s->s.startsWith("a")).forEach(System.out::println);

        //======================================================================================
        //Map(映射)中间操作 map 会将元素根据指定的 Function 接口来依次将元素转成另外的对象。
        stringList.stream().map(String::toLowerCase).sorted((a,b)->b.compareTo(a)).forEach(System.out::println);

        //======================================================================================
        //Match(匹配)
        boolean any = stringList.stream().anyMatch(s->s.startsWith("a"));
        //true
        System.out.println(any);

        boolean all = stringList.stream().allMatch(s->s.startsWith("a"));
        //false
        System.out.println(all);

        boolean none = stringList.stream().noneMatch(s->s.startsWith("q"));
        //true
        System.out.println(none);

        //======================================================================================
        //Count(计数)
        long startCount = stringList.stream().filter(s->s.startsWith("a")).count();
        System.out.println(startCount);

        //======================================================================================
        /**
         * Reduce------>start
         */
        //Reduce(规约),这是一个 最终操作 ，允许通过指定的函数来讲stream中的多个元素规约为一个元素，规约后的结果是通过Optional 接口表示
        Optional<String> reduce = stringList.stream().sorted().reduce((a,b)->a+"++"+b);
        reduce.ifPresent(System.out::println);
        reduce.ifPresent(t->{
            System.out.println(t);
        });
        System.out.println(reduce.get());
        // 字符串连接，concat = "ABCD"
        String concat = Stream.of("A","B","C").reduce("",String::concat);
        // 求最小值
        double minVal = Stream.of(-1.5,2.3,20.1).reduce(Double.MAX_VALUE,Double::min);
        // 求和,有起始值
        int sumval = Stream.of(1,2,3,4).reduce(0,Integer::sum);
        // 求和,无起始值
        sumval = Stream.of(1,2,3,4).reduce(Integer::sum).get();
        // 过滤，字符串连接，concat = "ace"
        concat = Stream.of("a","B","c","D","e","F").filter(t->t.compareTo("Z")>0).reduce("",String::concat);
        /**
         * Reduce------>end
         */

        //======================================================================================

    }
}
